#include <bits/stdc++.h>
using namespace std;

// 函数：计算给定文件名列表在指定宽度下排列的最少行数，抄这个函数即可
int LsCommand(vector<string>& filenames, int width) {
    //变量名可能有区别，需要自己关注一下
    sort(filenames.begin(), filenames.end());  // 按字典序升序排序文件名
    int rows = 1;      // 初始化行数，至少需要 1 行
    int curLen = 0;    // 当前行已占用的字符长度，包括文件名和列间空格
    // 遍历每个文件名
    for (auto &file : filenames) {
        int addLen = file.size();  // 当前文件名长度
        if (curLen > 0) addLen += 2;  // 如果不是当前行的第一个文件名，需要加上至少 2 个空格间隔
        // 判断当前行能否放下这个文件名
        if (curLen + addLen <= width) {
            curLen += addLen;        // 可以放下，累加当前行长度
        } else {
            rows++;                  // 放不下，则增加一行
            curLen = file.size();    // 新行起始长度为当前文件名长度（首列不需要空格）
        }
    }
    return rows;  // 返回最少行数
}

//以下内容不需要抄
int main() {
    // 测试文件名列表
    vector<string> filenames = {"aaaaaaaaaaaa20.block", "file9.cpp", "bbbbbbbb10", "filef8.c"};
    int width = 42;  // 每行最大宽度
    // 调用函数，输出最少行数
    cout << "最少行数: " << LsCommand(filenames, width) << endl;
    return 0;
}
